﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms; using Montana.Entidades;

namespace Montana
{
    public partial class frmListaPrecio : Form
    {
        public frmListaPrecio()
        {
            InitializeComponent();
        }

        private void frmListaPrecio_Load(object sender, EventArgs e)
        {
            CargarColumnasProducto();

            CargarListasPrecio();

            Producto prod = new Producto();
            prod.CargarCombo(cboProducto, prod.TraerTodos());
            cboProducto.Items.Insert(0, new Producto());
        }

        private void CargarListasPrecio()
        {
            cboListaPrecio.Items.Clear();

            ListaPrecio lp = new ListaPrecio();
            lp.CargarCombo(cboListaPrecio, lp.TraerTodos());
            cboListaPrecio.Items.Insert(0, new ListaPrecio());
        }

        private void CargarColumnasProducto()
        {
            lswProducto.Columns.Add("Código", 100);
            lswProducto.Columns.Add("Nombre", 250);
            lswProducto.Columns.Add("Precio", 100, HorizontalAlignment.Right);
            lswProducto.Columns.Add("Precio M. Obra", 110, HorizontalAlignment.Right);
        }

        private void cboListaPrecio_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cboListaPrecio.SelectedIndex == -1)
                return;

            CargarProductos();
        }

        private void CargarProductos()
        {
            ListaPrecio lp = cboListaPrecio.SelectedItem as ListaPrecio;
            ListaPrecioProducto lpp = new ListaPrecioProducto();

            List<ListaPrecioProducto> productos = lpp.BuscarProductosPorLista(lp.ID);
            
            lswProducto.Items.Clear();
            foreach (var p in productos)
            {
                lswProducto.Items.Add(p.CodigoProducto);
                lswProducto.Items[lswProducto.Items.Count - 1].Tag = p;
                lswProducto.Items[lswProducto.Items.Count - 1].SubItems.Add(p.Producto);
                lswProducto.Items[lswProducto.Items.Count - 1].SubItems.Add(p.Preciooriginal.ToString("$ 0.00"));
                lswProducto.Items[lswProducto.Items.Count - 1].SubItems.Add(p.Preciomanoobra.ToString("$ 0.00"));
            }
        }

        private void btnCerrar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void txtCodigoProducto_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == (char)13)
            {
                if (txtCodigoProducto.Text == "")
                    return;

                Producto prod = new Producto();
                List<Producto> items = prod.BuscarPorCodigo(txtCodigoProducto.Text);

                if (items.Count == 0)
                    return;

                cboProducto.SelectedValue = items[0].ID.ToString();

                txtPrecio.Focus();    

                e.Handled = true;
            }
        }

        private void cboProducto_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cboProducto.Text == "")
                return;

            Producto prod = new Producto();
            prod = cboProducto.SelectedItem as Producto;
            prod = prod.BuscarPorID(prod.ID);

            txtPrecio.Text = prod.Preciooriginal.ToString("0.00");
            txtPrecioManoObra.Text =  prod.Preciomanoobra.ToString("0.00");
            txtCodigoProducto.Text = prod.Codigo;
        }

        private void btnNuevaListaPrecio_Click(object sender, EventArgs e)
        {
            frmNuevaListaPrecio frm = new frmNuevaListaPrecio();

            frm.ShowDialog();

            CargarListasPrecio();

            cboListaPrecio.SelectedIndex = cboListaPrecio.FindStringExact(frm.NuevaListaPrecio);
        }

        private void frmListaPrecio_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.KeyCode)
            {
                case Keys.F1:
                    btnNuevaListaPrecio_Click(this, null);
                    break;
                case Keys.F2:
                    btnActualizarPrecios_Click(this, null);
                    break;
            }
        }

        public bool SeSeleccionoListaPrecio()
        {
            if (cboListaPrecio.SelectedIndex == -1 || cboListaPrecio.SelectedIndex == 0)
            {
                Validacion.MostrarError(cboListaPrecio, "Debe seleccionar una lista de precios");
                return false;
            }

            return true;
        }

        private void btnBorrarListaPrecio_Click(object sender, EventArgs e)
        {
            if (!SeSeleccionoListaPrecio())
                return;

            if (Validacion.MostrarMensaje("¿Confirma que desea borrar la lista de precios '" + cboListaPrecio.Text + "'?", TipoMensaje.Pregunta) == DialogResult.No)
                return;

            ListaPrecio lp = new ListaPrecio();
            lp = cboListaPrecio.SelectedItem as ListaPrecio;

            if (lp == null)
            {
                Validacion.MostrarMensaje("Ha ocurrido un error, contacte al programador del sistema", TipoMensaje.Error);
                return;
            }

            lp.Borrar(lp.ID);

            Validacion.MostrarMensaje("La lista de precios fue borrada");

            CargarListasPrecio();
        }

        private void btnAgregarProducto_Click(object sender, EventArgs e)
        {
            if (!SeSeleccionoListaPrecio())
                return;

            if (cboProducto.SelectedIndex == -1 || cboProducto.SelectedIndex == 0)
            {
                Validacion.MostrarError(cboProducto, "Debe seleccionar un producto");
                return;
            }

            ListaPrecioProducto lpp = new ListaPrecioProducto();
            Producto p = cboProducto.SelectedItem as Producto;
            ListaPrecio lp = cboListaPrecio.SelectedItem as ListaPrecio;

            if (lpp.SeCargoProducto(lp.ID, p.ID))
            {
                Validacion.MostrarError(cboProducto, "El producto seleccionado ya fue cargado en la lista de precios");
                return;
            }

            if (lp == null || p == null)
            {
                Validacion.MostrarMensaje("Ha ocurrido un error, contacte al programador del sistema", TipoMensaje.Error);
                return;
            }

            lpp.IDListaprecio = lp.ID;
            lpp.IDProducto = p.ID;

            lpp.Agregar();

            CargarProductos();
        }

        private void btnActualizarPrecios_Click(object sender, EventArgs e)
        {
            if (!SeSeleccionoListaPrecio())
                return;

            frmCambiarPrecios frm = new frmCambiarPrecios();
            ListaPrecio lp = cboListaPrecio.SelectedItem as ListaPrecio;

            frm.IDListaPrecio = lp.ID;
            frm.ListaPrecio = lp.Nombre;

            frm.ShowDialog();

            CargarProductos();
        }

        private void btnBorrarProducto_Click(object sender, EventArgs e)
        {
            if (!SeSeleccionoListaPrecio())
                return;

            if (lswProducto.SelectedItems.Count == 0)
            {
                Validacion.MostrarError(lswProducto, "Debe seleccionar un producto de la lista");                
                return;
            }

            ListaPrecioProducto lpp = lswProducto.SelectedItems[0].Tag as ListaPrecioProducto;
            ListaPrecio lp = cboListaPrecio.SelectedItem as ListaPrecio;

            if (lp == null || lpp == null)
            {
                Validacion.MostrarMensaje("Ha ocurrido un error, contacte al programador del sistema", TipoMensaje.Error);
                return;
            }

            if (Validacion.MostrarMensaje("¿Confirma que desea quitar el producto '" + 
                lpp.Producto + "' de la lista de precios '" + 
                lp.Nombre + "'?", TipoMensaje.Pregunta) == DialogResult.No)
            {
                return;
            }

            lpp.QuitarProducto(lp.ID, lpp.IDProducto);
            
            Validacion.MostrarMensaje("El producto fue quitado de la lista de precios");

            CargarProductos();
        }

    }
}
